// fileUtils.js - 文件操作工具类

class FileUtils {
  constructor() {
    // 文件存储路径
    this.cacheDir = 'tts_cache';
  }

  /**
   * 初始化缓存目录
   * @returns {Promise<void>}
   */
  async initCacheDir() {
    try {
      // 检查缓存目录是否存在
      const fs = wx.getFileSystemManager ? wx.getFileSystemManager() : null;
      if (!fs) {
        console.warn('当前环境不支持文件系统操作');
        return;
      }

      try {
        // 尝试获取目录信息，检查是否存在
        fs.statSync(`${wx.env.USER_DATA_PATH}/${this.cacheDir}`);
      } catch (error) {
        // 目录不存在，创建目录
        fs.mkdirSync(`${wx.env.USER_DATA_PATH}/${this.cacheDir}`, true);
        console.log(`创建缓存目录: ${this.cacheDir}`);
      }
    } catch (error) {
      console.error('初始化缓存目录失败:', error);
      throw error;
    }
  }

  /**
   * 生成缓存文件的唯一标识符
   * @param {string} text - 文本内容
   * @returns {string} 文件名
   */
  generateCacheFileName(text) {
    // 使用简单的哈希算法生成文件名
    let hash = 0;
    if (text.length === 0) return 'empty';
    for (let i = 0; i < text.length; i++) {
      const char = text.charCodeAt(i);
      hash = ((hash << 5) - hash) + char;
      hash = hash & hash; // 转换为32位整数
    }
    return `tts_${Math.abs(hash)}.mp3`;
  }

  /**
   * 检查缓存文件是否存在
   * @param {string} fileName - 文件名
   * @returns {Promise<boolean>}
   */
  async checkFileExists(fileName) {
    return new Promise((resolve) => {
      try {
        const fs = wx.getFileSystemManager ? wx.getFileSystemManager() : null;
        if (!fs) {
          resolve(false);
          return;
        }

        const filePath = `${wx.env.USER_DATA_PATH}/${this.cacheDir}/${fileName}`;
        fs.statSync(filePath);
        resolve(true);
      } catch (error) {
        resolve(false);
      }
    });
  }

  /**
   * 获取缓存文件路径
   * @param {string} fileName - 文件名
   * @returns {string} 文件路径
   */
  getCacheFilePath(fileName) {
    return `${wx.env.USER_DATA_PATH}/${this.cacheDir}/${fileName}`;
  }

  /**
   * 下载文件并保存到本地
   * @param {string} url - 文件URL
   * @param {string} fileName - 文件名
   * @returns {Promise<string>} 本地文件路径
   */
  async downloadFile(url, fileName) {
    await this.initCacheDir();
    
    const filePath = this.getCacheFilePath(fileName);
    
    return new Promise((resolve, reject) => {
      wx.downloadFile({
        url: url,
        filePath: filePath,
        success: (res) => {
          if (res.statusCode === 200) {
            console.log(`文件下载成功: ${filePath}`);
            resolve(filePath);
          } else {
            console.error(`文件下载失败，状态码: ${res.statusCode}`);
            reject(new Error(`文件下载失败，状态码: ${res.statusCode}`));
          }
        },
        fail: (error) => {
          console.error('文件下载失败:', error);
          reject(error);
        }
      });
    });
  }

  /**
   * 清理过期的缓存文件
   * @param {number} maxAge - 最大缓存时间(毫秒)
   */
  async cleanupCache(maxAge = 7 * 24 * 60 * 60 * 1000) { // 默认7天
    try {
      const fs = wx.getFileSystemManager ? wx.getFileSystemManager() : null;
      if (!fs) {
        return;
      }

      const now = Date.now();
      const dirPath = `${wx.env.USER_DATA_PATH}/${this.cacheDir}`;
      
      try {
        const files = fs.readdirSync(dirPath);
        let deletedCount = 0;
        
        for (const file of files) {
          const filePath = `${dirPath}/${file}`;
          const stat = fs.statSync(filePath);
          
          // 检查文件是否过期
          if (now - stat.mtime > maxAge) {
            fs.unlinkSync(filePath);
            deletedCount++;
          }
        }
        
        if (deletedCount > 0) {
          console.log(`清理了 ${deletedCount} 个过期缓存文件`);
        }
      } catch (error) {
        console.error('清理缓存失败:', error);
      }
    } catch (error) {
      console.error('清理缓存时发生错误:', error);
    }
  }
}

module.exports = FileUtils;